import axios from 'axios';
import { message } from 'ant-design-vue';
import store from '@/store';
import router from '@/router';
import { getCache, removeCache } from '@/utils/session';
let baseURL = process.env.NODE_ENV == 'development' ? '/api' : 'http://36.26.76.196:29990';
// let baseURL = process.env.NODE_ENV == 'development' ? '/api' : 'http://47.99.193.223:29990';
const service = axios.create({
    baseURL,
    timeout: 30000 // 请求超时时间
});
//请求
service.interceptors.request.use(config => {
    let token = getCache('TOKEN') || '';
    config.headers['token'] = token;
    // config.headers['tenant'] = store.getters.tenant;
    return config;
});

//响应
service.interceptors.response.use(
    response => {
        let { code = 200 } = response.data;
        if (code == 200 || code==302) {
            return Promise.resolve(response);
        } else {
            message.error(response.data.msg || '操作错误');
            return Promise.reject(response);
        }
    },
    error => {
        if (error.response && error.response.status) {
            switch (error.response.status) {
                // 401: 未登录
                // 未登录则跳转登录页面，并携带当前页面的路径
                // 在登录成功后返回当前页面，这一步需要在登录页操作。
                case 401:
                    message.error('未授权');
                    // 清除token
                    removeCache('TOKEN');
                    removeCache('tenantInfo');
                    removeCache('permissions');
                    removeCache('routers');
                    store.commit('user/SET_TOKEN', '');
                    let tenant = getCache('tenant') || 'master';
                    // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
                    setTimeout(() => {
                        router.replace({
                            path: `/${tenant}/login`
                        });
                    }, 1000);
                    break;
                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面
                case 403:
                    message.error('禁止访问');
                    router.go(-1);
                    break;
                // 404请求不存在
                case 404:
                    message.error('网络请求不存在');
                    break;
                // 其他错误，直接抛出错误提示
                default:
                    message.error(error.response.data.msg || error.response.data.error || '请求错误');
            }
            return Promise.reject(error.response.data);
        } else {
            message.error('请求错误，请重试');
            return Promise.reject(error.response);
        }
    }
);

let http = {};

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.get = function(url, params = null, responseType = 'JSON') {
    return new Promise((resolve, reject) => {
        service
            .get(url, { params, responseType })
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.post = function(url, data, responseType = 'JSON') {
    return new Promise((resolve, reject) => {
        service
            .post(url, data,{responseType})
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};
/**
 * put方法，对应put请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.put = function(url, data) {
    return new Promise((resolve, reject) => {
        service
            .put(url, data)
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

/**
 * delete方法，对应delete请求
 * @param {String} url [请求的url地址]
 * @param {Object} data [请求时携带的参数]
 */

http.delete = function(url, data) {
    return new Promise((resolve, reject) => {
        service
            .delete(url, { data })
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

export default http;
